package com.galeno.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

/**
 * @author galeno
 * @Title:
 * @Description:
 * @date 2021/7/2321:41
 */
@SuppressWarnings("all")
public class HdfsClient {
    FileSystem fs;

    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        //连接集群的NameNode地址
        URI uri = new URI("hdfs://galeno01:8020");
        //客户端用户
        String user = "root";
        //创建配置文件
        Configuration configuration = new Configuration();
        //获得连接客户端对象
        fs = FileSystem.get(uri, configuration, user);

    }

    @After
    public void close() throws IOException {
        //关闭资源
        fs.close();
    }

    @Test
    public void testMkdir() throws IOException {
        //创建一个文件夹
        fs.mkdirs(new Path("/xiyou/huoguashan"));
    }
    //上传
    /**
     * 参数优先级
     * hdfs-default.xml  <  hdfs-site.xml<  在项目资源目录下的配置文件  < 代码里面的配置
     */
    @Test
    public void testPut() throws IOException {
        //参数    源数据是否删除   是否覆盖    源数据路径    目的地路径
        fs.copyFromLocalFile(false, false, new Path("E:/word.txt"), new Path("/xiyou/huoguashan"));
    }

    //文件下载
    @Test
    public void testGet() throws IOException {
        //参数   源文件是否删除,源文件路径,目标地址路径,
        fs.copyToLocalFile(false, new Path("/xiyou/huoguashan/word.txt"), new Path("D:\\"), false);

    }

    //文件删除
    @Test
    public void deleteTest() throws IOException {
        //要删除的路径.是否递归删除
        fs.delete(new Path("/xiyou/huoguashan/word.txt"), true);
        //删除空目录

        //删除非空目录
    }

    //文件的更名和移动
    @Test
    public void renameTest() throws IOException {
        //  源文件路径  目标路径
        //文件的修改
        fs.rename(new Path("/xiyou/huoguashan/word.txt"), new Path("/xiyou/huoguashan/ss.txt"));
        //文件的移动和更名
        fs.rename(new Path("/xiyou/huoguashan/ss.txt"), new Path("/xiyou/zs.txt"));
        //目录更名

    }

    //获取文件详细信息
    @Test
    public void fileDetail() throws IOException {
        //获取文件的所有信息
        RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fs.listFiles(new Path("/"), true);
        //遍历文件
        while (locatedFileStatusRemoteIterator.hasNext()) {
            LocatedFileStatus fileStatus = locatedFileStatusRemoteIterator.next();
            System.out.println("========" + fileStatus.getPath());
            System.out.println(fileStatus.getOwner());
            System.out.println(fileStatus.getGroup());
            System.out.println(Arrays.asList(fileStatus.getBlockLocations()));
            System.out.println(fileStatus.getLen());
            System.out.println(fileStatus.getReplication());
            System.out.println(fileStatus.getBlockSize());
            System.out.println(fileStatus.getModificationTime());
            System.out.println(fileStatus.getPath().getName());

        }
    }

    //判断文件还是文件夹
    @Test
    public void testFile() throws IOException {
        FileStatus[] listStatus = fs.listStatus(new Path("/"));
        for (FileStatus status : listStatus) {
            if (status.isFile()) {
                System.out.println(status.getPath().getName() + "是文件");
            } else {
                System.out.println(status.getPath().getName() + "是文件夹");
            }

        }

    }


}
